summaryrefslogtreecommitdiff
path: root/src/pages/notes/[...page].astro
diff options
context:
space:
mode:
Diffstat (limited to 'src/pages/notes/[...page].astro')
-rw-r--r--src/pages/notes/[...page].astro63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/pages/notes/[...page].astro b/src/pages/notes/[...page].astro
new file mode 100644
index 0000000..fdc5af9
--- /dev/null
+++ b/src/pages/notes/[...page].astro
@@ -0,0 +1,63 @@
+---
+import { type CollectionEntry, getCollection } from "astro:content";
+import Pagination from "@/components/Paginator.astro";
+import Note from "@/components/note/Note.astro";
+import PageLayout from "@/layouts/Base.astro";
+import { collectionDateSort } from "@/utils/date";
+import type { GetStaticPaths, Page } from "astro";
+import { Icon } from "astro-icon/components";
+
+export const getStaticPaths = (async ({ paginate }) => {
+ const MAX_NOTES_PER_PAGE = 10;
+ const allNotes = await getCollection("note");
+ return paginate(allNotes.sort(collectionDateSort), { pageSize: MAX_NOTES_PER_PAGE });
+}) satisfies GetStaticPaths;
+
+interface Props {
+ page: Page<CollectionEntry<"note">>;
+ uniqueTags: string[];
+}
+
+const { page } = Astro.props;
+
+const meta = {
+ description: "Read my collection of notes",
+ title: "Notes",
+};
+
+const paginationProps = {
+ ...(page.url.prev && {
+ prevUrl: {
+ text: "← Previous Page",
+ url: page.url.prev,
+ },
+ }),
+ ...(page.url.next && {
+ nextUrl: {
+ text: "Next Page →",
+ url: page.url.next,
+ },
+ }),
+};
+---
+
+<PageLayout meta={meta}>
+ <section>
+ <h1 class="title mb-6 flex items-center gap-3">
+ Notes <a class="text-accent" href="/notes/rss.xml" target="_blank">
+ <span class="sr-only">RSS feed</span>
+ <Icon aria-hidden="true" class="h-6 w-6" focusable="false" name="mdi:rss" />
+ </a>
+ </h1>
+ <ul class="mt-6 space-y-8 text-start">
+ {
+ page.data.map((note) => (
+ <li class="">
+ <Note note={note} as="h2" isPreview />
+ </li>
+ ))
+ }
+ </ul>
+ <Pagination {...paginationProps} />
+ </section>
+</PageLayout>